package com.kaguya.singleton;

/**
 * 创建型 单例模式
 * 单例模式：饿汉模式：和懒汉模式相同，满足单例的条件，即其他放不能调用构造函数来实例化对象，只能有public静态方法来获取实例
 * 由于类的static方法，属性 是属于这个类的，所以满足线程安全，（利用类加载的方式来保证线程安全）且在类在加载时就会初始化
 * 因此我们可以在对象前声明static，使得这个类在类在加载的时候就初始化
 */
public class HungrySingletonTest {

    public static void main(String[] args) {

    }

    /**
     * 内部类 与单例无关
     */
    public static class Dog{
        // 方法一，私有化 静态 属性 类再加载时就初始化
        //private static Dog instance = new Dog();

        // 方法二，静态代码块
        private static Dog instance;

        static {
            instance = new Dog();
        }

        //私有化构造方法
        private Dog() {
            //防止通过 反射来初始化，从而破坏单例
            if(null != Dog.instance) {
                throw new RuntimeException("单例不允许多个实例");
            }
        }

        //公共调用实例化方法 这个类只能通过此方法进行调用
        public static Dog getInstance(){
            return instance;
        }
    }
}
